package Multiplexer;

import Memento.Memento;
import Memento.Memoire;
import Nuplet.Pair;
import TasDePapiers.TasDePapiers;

import editeur.EditeurPlus;
import editeurimpl.Buffer;
import editeurimpl.EditeurImpl;
import editeurimpl.PressePapier;
import editeurimpl.Selection;


public class EditeurPlusImpl extends EditeurImpl implements EditeurPlus {
        Memoire memundo;
        TasDePapiers tas;
        
        public EditeurPlusImpl(Selection sel, Buffer buffer,PressePapier pressepapier, Memoire undoredo,TasDePapiers poussepousse) {
                super(sel,buffer,pressepapier);
                memundo=undoredo;
                tas=poussepousse;
        }
        public void retenir(Memento m){
                memundo.add(m);
        }
        public void annuler() {
                memundo.annuler();
        }
        public void refaire() {
                memundo.refaire();
        }       
        public boolean trouver(String mot,int deb){
                int index;
                if (selection.active()){
                        index=buffer.toString().indexOf(mot,selection.getfin());
                }else index=buffer.toString().indexOf(mot,deb);
                boolean trouve=(index!=-1);
                if (trouve){
                        
                        int pos=index;
                        selection.setdebut(pos);
                        selection.setfin(pos+mot.length());
                        
                }
                return trouve;
        }
        public boolean trouver_en_arriere(String mot,int deb){
                int index;
                if (selection.active()){
                        index=buffer.gettext(0, selection.getdebut()).lastIndexOf(mot); 
                }
                else index=buffer.gettext(0, deb).lastIndexOf(mot);     
                
                boolean trouve=(index!=-1);
                if (trouve){
                        int pos=index;
                        selection.setdebut(pos);
                        selection.setfin(pos+mot.length());
                        
                }
                return trouve;
        }
        public int IndexToLineNumber(int pos) {
                return buffer.IndexToLineNumber(pos);
        }
        public int LineNumberToIndex(int pos) {
                return buffer.LineNumberToIndex(pos);
        }
        public void select_line(int pos) {
                selection.setdebut(buffer.DebutDeLigne(pos));
                selection.setfin(buffer.FinDeLigne(pos));
        }
        public int text_popAll(int pos) {
                String t=tas.popAll();
                buffer.inserer(t,pos);
                return t.length();
        }
        public void text_push() {
                if (selection.active()) {
                         tas.push( buffer.gettext( selection.getdebut(), selection.getfin() ) );
                        }
        }
		public void clean_pusher() {
			tas.pushreset();
		}
		public int debut_ligne(int pos) {
			return buffer.DebutDeLigne(pos);
		}
		public int fin_ligne(int pos) {
			return buffer.FinDeLigne(pos);
		}
		public Pair<Integer, Integer> IndexToCoord(int index) {
			return buffer.IndexToCoord(index);
		}
        
}